উদাহরণ সহ Role-Based এবং Permission-Based Authorization

Java Technologies - স্প্রিং সিকিউরিটি (Spring Security) - Role-Based এবং Permission-Based Authorization
165

স্প্রিং সিকিউরিটিতে Role-Based Authorization এবং Permission-Based Authorization ব্যবহার করে সুনির্দিষ্ট অ্যাক্সেস নিয়ন্ত্রণ সহজেই বাস্তবায়ন করা যায়। নিচে দুটি কৌশলের জন্য উদাহরণসহ সম্পূর্ণ ব্যাখ্যা দেওয়া হলো:


১. Role-Based Authorization

কাজের মূলনীতি:

  • ব্যবহারকারীকে বিভিন্ন Role (যেমন ROLE_USER, ROLE_ADMIN) দেওয়া হয়।
  • সুনির্দিষ্ট পেজ বা API অ্যাক্সেস করার জন্য রোল যাচাই করা হয়।

উদাহরণ: Role-Based Authorization

Step 1: Maven/Gradle Dependencies

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

Step 2: Security Configuration

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;

@Configuration
public class SecurityConfig {

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests(auth -> auth
                .requestMatchers("/admin/**").hasRole("ADMIN") // Role-based access
                .requestMatchers("/user/**").hasRole("USER")
                .anyRequest().authenticated()
            )
            .formLogin()
            .and()
            .logout().permitAll();
        return http.build();
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}

Step 3: User Configuration (In-Memory User Store)

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;

@Configuration
public class UserConfig {

    @Bean
    public UserDetailsService userDetailsService(PasswordEncoder passwordEncoder) {
        UserDetails user = User.builder()
                .username("user")
                .password(passwordEncoder.encode("password"))
                .roles("USER")
                .build();

        UserDetails admin = User.builder()
                .username("admin")
                .password(passwordEncoder.encode("admin"))
                .roles("ADMIN")
                .build();

        return new InMemoryUserDetailsManager(user, admin);
    }
}

Step 4: Controller

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class RoleController {

    @GetMapping("/user/home")
    public String userHome() {
        return "Welcome to User Home";
    }

    @GetMapping("/admin/home")
    public String adminHome() {
        return "Welcome to Admin Home";
    }
}

২. Permission-Based Authorization

কাজের মূলনীতি:

  • প্রতিটি ব্যবহারকারীর নির্দিষ্ট Permission (যেমন READ_PRIVILEGE, WRITE_PRIVILEGE) দেওয়া হয়।
  • ব্যবহৃত রিসোর্সে অ্যাক্সেস অনুমোদনের জন্য পারমিশন যাচাই করা হয়।

উদাহরণ: Permission-Based Authorization

Step 1: Security Configuration

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;

@Configuration
public class SecurityConfig {

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests(auth -> auth
                .requestMatchers("/read").hasAuthority("READ_PRIVILEGE") // Permission-based access
                .requestMatchers("/write").hasAuthority("WRITE_PRIVILEGE")
                .anyRequest().authenticated()
            )
            .formLogin()
            .and()
            .logout().permitAll();
        return http.build();
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}

Step 2: Custom UserDetailsService

import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;

import java.util.Arrays;

@Service
public class CustomUserDetailsService implements UserDetailsService {

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        if ("reader".equals(username)) {
            return new User(
                "reader",
                new BCryptPasswordEncoder().encode("password"),
                Arrays.asList(new SimpleGrantedAuthority("READ_PRIVILEGE"))
            );
        } else if ("writer".equals(username)) {
            return new User(
                "writer",
                new BCryptPasswordEncoder().encode("password"),
                Arrays.asList(
                    new SimpleGrantedAuthority("READ_PRIVILEGE"),
                    new SimpleGrantedAuthority("WRITE_PRIVILEGE")
                )
            );
        } else {
            throw new UsernameNotFoundException("User not found");
        }
    }
}

Step 3: Controller

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class PermissionController {

    @GetMapping("/read")
    public String readAccess() {
        return "You have read access!";
    }

    @GetMapping("/write")
    public String writeAccess() {
        return "You have write access!";
    }
}

উপসংহার

বৈশিষ্ট্যRole-Based AuthorizationPermission-Based Authorization
অ্যাক্সেস কন্ট্রোল স্তরসম্পূর্ণ রোল দ্বারা নিয়ন্ত্রিতসুনির্দিষ্ট পারমিশন দ্বারা নিয়ন্ত্রিত
ব্যবহারকারীর নিয়ন্ত্রণসাধারণ এবং সীমিত নিয়ন্ত্রণআরও সূক্ষ্ম (Fine-Grained) নিয়ন্ত্রণ
উদাহরণhasRole("ADMIN")hasAuthority("WRITE_PRIVILEGE")

উপসংহার:

  • Role-Based Authorization সহজ এবং দ্রুত বাস্তবায়নের জন্য কার্যকর।
  • Permission-Based Authorization যখন জটিল এবং সূক্ষ্ম নিয়ন্ত্রণ প্রয়োজন হয় তখন প্রয়োজনীয়।

আপনার প্রজেক্টের প্রয়োজন অনুযায়ী এই দুইটি পদ্ধতির মধ্যে যেকোনো একটি বা উভয় একসাথে ব্যবহার করতে পারেন।

Content added By
Promotion
NEW SATT AI এখন আপনাকে সাহায্য করতে পারে।

Are you sure to start over?

Loading...